/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import model.dto.ColetaDTO;

/**
 *
 * @author Gabriel
 */
public class ColetaDAO extends DAO {

    private static final String SELECT_COLETA =
                                        "select c.Id,\n" +
                                        "       c.Id_Matriz,\n" +
                                        "       c.Data\n" +
                                        "from coleta c, matriz m, especie e\n" +
                                        "where c.Id_Matriz = m.Id\n" +
                                        "  and m.Id_Especie = e.Id";


    public ColetaDAO() throws SQLException, ClassNotFoundException {
        super();
    }

    private ColetaDTO getColetaResultSet(ResultSet rs) throws SQLException {
        ColetaDTO coletaDTO = new ColetaDTO();
        coletaDTO.setId(rs.getInt("Id"));
        coletaDTO.setIdMatriz(rs.getInt("Id_Matriz"));
        coletaDTO.setData(rs.getDate("Data"));
        return coletaDTO;
    }

    private LinkedList<ColetaDTO> getColetasResultSet(ResultSet rs) throws SQLException {
        LinkedList<ColetaDTO> registroSaidaDTOs = new LinkedList<ColetaDTO>();
        while (rs.next()) {
            registroSaidaDTOs.add(getColetaResultSet(rs));
        }
        return registroSaidaDTOs;
    }

    public LinkedList<ColetaDTO> getTodasColetas() throws SQLException {
        sql = SELECT_COLETA + ";";
        connector.executeSelectQuery(sql);
        return getColetasResultSet(resultSet);
    }

    public LinkedList<ColetaDTO> pesquisaColeta(Integer id,
                                                       Date data,
                                                       Integer idMatriz,
                                                       String nomeEspecie) throws SQLException {
        sql = SELECT_COLETA;

        if (id != null) {
            sql += "  AND Id = " + id + "\n";
        }

        if (data != null) {
            sql += "  AND Data = " + data + "\n";
        }

        if (idMatriz != null) {
            sql += "  AND Id_Matriz = " + idMatriz + "\n";
        }

        if (nomeEspecie != null) {
            sql += " AND (e.nome_cientifico like '%" + nomeEspecie + "%' OR e.nome_vulgar like '%" + nomeEspecie + "%')\n";
        }

        sql += ";";

        resultSet = connector.executeSelectQuery(sql);

        return getTodasColetas();

    }

    public void insereRegistroSaida(ColetaDTO coletaDTO) throws SQLException {
        sql += "insert into coleta(id_matriz, data)" +
               "values("+coletaDTO.getIdMatriz()+","+coletaDTO.getData()+")";
        connector.executeInsertQuery(sql);
    }

    public void atualizaRegistroSaida(ColetaDTO coletaDTO,
                                      boolean atualizaIdMatriz,
                                      boolean atualizaData) throws SQLException {

        /* O booleano abaixo informa se a instrução SQL ainda não recebeu nenhuma
           atualização. Desta maneira é possível saber se a condição virá precedida
           de uma vírgula ou não. */
        boolean naoPossuiAtualizacaoAinda = true;

        sql = "UPDATE COLETA\n" +
              "SET ";

        if (atualizaData) {
            sql += "Data = " + coletaDTO.getData() + "\n";
            naoPossuiAtualizacaoAinda = false;
        }

        if (atualizaIdMatriz) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Id_Matriz = " + coletaDTO.getIdMatriz() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Id_Matriz = " + coletaDTO.getIdMatriz() + "\n";
            }
        }

        sql += "WHERE Id = " + coletaDTO.getId() + ";";

        connector.executeUpdateQuery(sql);
    }

}
